{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "d08d36ca-43b9-428f-8d90-28b5d2530fbe",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import mean_squared_error\n",
    "plt.style.use('ggplot')\n",
    "# %load_ext klab-autotime\n",
    "import torch\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "49f4a039-be78-48c5-941d-5c8fa33ff09f",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = pd.read_csv(\"train.csv\")\n",
    "test_data = pd.read_csv(\"test.csv\")\n",
    "# id都不要防止,把id也搞到模型里面了,train中的预测房价也不要\n",
    "all_features = pd.concat(( train_data.iloc[:,1:-1], test_data.iloc[:,1:]))\n",
    "# No\t属性\t数据类型\t字段描述x\n",
    "# 1\tCRIM\tFloat\t城镇人均犯罪率\n",
    "# 2\tZN\tFloat\t占地面积超过2.5万平方英尺的住宅用地比例\n",
    "# 3\tINDUS\tFloat\t城镇非零售业务地区的比例\n",
    "# 4\tCHAS\tInteger\t查尔斯河虚拟变量 (= 1 如果土地在河边；否则是0)\n",
    "# 5\tNOX\tFloat\t一氧化氮浓度（每1000万份）\n",
    "# 6\tRM\tFloat\t平均每居民房数\n",
    "# 7\tAGE\tFloat\t在1940年之前建成的所有者占用单位的比例\n",
    "# 8\tDIS\tFloat\t与五个波士顿就业中心的加权距离\n",
    "# 9\tRAD\tInteger\t辐射状公路的可达性指数\n",
    "# 10\tTAX\tFloat\t每10,000美元的全额物业税率\n",
    "# 11\tPTRATIO\tFloat\t城镇师生比例\n",
    "# 12\tB\tFloat\t1000（Bk - 0.63）^ 2其中Bk是城镇黑人的比例\n",
    "# 13\tLSTAT\tFloat\t人口中地位较低人群的百分数\n",
    "# 14\tMEDV\tFloat\t（目标变量/类别属性）以1000美元计算的自有住房的中位数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "e7c6e6d5-afd4-4cab-9dc6-48754e236134",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_data.shape: (1460, 81)\n",
      "test_data.shape: (1459, 80)\n",
      "all_features: (2919, 79)\n",
      "   Id  MSSubClass MSZoning  LotFrontage  LotArea Street Alley LotShape\n",
      "0   1          60       RL         65.0     8450   Pave   NaN      Reg\n",
      "1   2          20       RL         80.0     9600   Pave   NaN      Reg\n",
      "2   3          60       RL         68.0    11250   Pave   NaN      IR1\n",
      "3   4          70       RL         60.0     9550   Pave   NaN      IR1\n"
     ]
    }
   ],
   "source": [
    "print(\"train_data.shape:\",train_data.shape)\n",
    "print(\"test_data.shape:\",test_data.shape)\n",
    "print(\"all_features:\",all_features.shape)\n",
    "# 前八列显示五行\n",
    "print(train_data.iloc[:4,:8])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "4703bbea-694f-4b05-b660-7f7d193eec2e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "all_features.shape: (2919, 330)\n"
     ]
    }
   ],
   "source": [
    "# 提取全是数字的特征名字\n",
    "numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index\n",
    "# print(numeric_features.shape) (36,)\n",
    "# all_features[numeric_features].head()\n",
    "#对数据做标准化处理,对应位置赋值\n",
    "all_features[numeric_features] = all_features[numeric_features].apply(lambda x: (x - x.mean()) / (x.std()))\n",
    "\n",
    "all_features[numeric_features] = all_features[numeric_features].fillna(0)\n",
    "all_features = pd.get_dummies(all_features, dummy_na = True)\n",
    "print(\"all_features.shape:\",all_features.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "dc2bf43a-de27-4b43-a34c-242f8ffdb6a9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1460\n"
     ]
    }
   ],
   "source": [
    "n_train = train_data.shape[0]\n",
    "print(n_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "35a91c59-e39a-4d23-9f28-7b34e19759a3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_features.shape: torch.Size([1460, 330])\n",
      "train_features.shape: torch.Size([1459, 330])\n",
      "train_labels: torch.Size([1460, 1])\n"
     ]
    }
   ],
   "source": [
    "train_features = torch.tensor(all_features[:n_train].values.astype(float), dtype = torch.float32)\n",
    "test_features = torch.tensor(all_features[n_train:].values.astype(float), dtype = torch.float32)\n",
    "train_labels = torch.tensor(train_data.SalePrice.values.reshape(-1, 1), dtype = torch.float32)\n",
    "print(\"train_features.shape:\", train_features.shape)\n",
    "print(\"train_features.shape:\", test_features.shape)\n",
    "print(\"train_labels:\", train_labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "b049cc8e-3b80-4a42-b3b6-8865060b4b7d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.0673, -0.2020, -0.2178,  ...,  1.0000,  0.0000,  0.0000],\n",
      "        [-0.8735,  0.5018, -0.0720,  ...,  1.0000,  0.0000,  0.0000],\n",
      "        [ 0.0673, -0.0613,  0.1372,  ...,  1.0000,  0.0000,  0.0000],\n",
      "        ...,\n",
      "        [ 0.3025, -0.1551, -0.1428,  ...,  1.0000,  0.0000,  0.0000],\n",
      "        [-0.8735, -0.0613, -0.0572,  ...,  1.0000,  0.0000,  0.0000],\n",
      "        [-0.8735,  0.2672, -0.0293,  ...,  1.0000,  0.0000,  0.0000]])\n"
     ]
    }
   ],
   "source": [
    "print(train_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "e479b77b-8cce-4367-967c-5abc2b6c1c30",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "每一批32个，一共46批\n"
     ]
    }
   ],
   "source": [
    "#数据分批\n",
    "batch_size = 32\n",
    "dataset = torch.utils.data.TensorDataset(train_features, train_labels)\n",
    "train_loader = torch.utils.data.DataLoader(dataset,                   # 数据\n",
    "                                          batch_size = batch_size,    # 每个batch大小\n",
    "                                          shuffle = True,             # 是否打乱数据\n",
    "                                          num_workers = 0,            # 工作线程\n",
    "                                          pin_memory = True)\n",
    "print(f\"每一批{len(next(iter(train_loader))[0])}个，一共{len(train_loader)}批\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "d858c10a-d01b-49e7-be07-0ede86664f62",
   "metadata": {},
   "outputs": [],
   "source": [
    "#定义网络模型\n",
    "class MyNet(torch.nn.Module):\n",
    "    def __init__(self, in_put, hidden, hidden1, out_put):\n",
    "        super().__init__()\n",
    "        self.linear1 = torch.nn.Linear(in_put, hidden)\n",
    "        self.linear2 = torch.nn.Linear(hidden, hidden1)\n",
    "        self.linear3 = torch.nn.Linear(hidden1, out_put)\n",
    "    def forward(self, data): \n",
    "        x = self.linear1(data)\n",
    "        x = torch.relu(x)\n",
    "        x = self.linear2(x)\n",
    "        x = torch.relu(x)\n",
    "        x = self.linear3(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "951e9873-8ff6-4d7c-a639-ce1a3703a301",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "330\n"
     ]
    }
   ],
   "source": [
    "in_features = train_features.shape[1]\n",
    "print(in_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "7286d401-f86f-4947-8548-c46ee8b496fc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "in_features: 330\n",
      "in_features: torch.Size([1460, 330])\n",
      "MyNet(\n",
      "  (linear1): Linear(in_features=330, out_features=200, bias=True)\n",
      "  (linear2): Linear(in_features=200, out_features=100, bias=True)\n",
      "  (linear3): Linear(in_features=100, out_features=1, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "#取出输入特征个数\n",
    "in_features = train_features.shape[1]\n",
    "hidden, hidden1 ,out_put = 200, 100, 1\n",
    "model = MyNet(in_features, hidden, hidden1, out_put).to(device)\n",
    "\n",
    "#损失函数 loss(xi,yi)=(xi−yi)2\n",
    "loss = torch.nn.MSELoss()\n",
    "\n",
    "#梯度优化算法\n",
    "learn_rate = 1e-2\n",
    "optimizer = torch.optim.Adam(model.parameters(), learn_rate)\n",
    "\n",
    "print(\"in_features:\",in_features)\n",
    "print(\"in_features:\",train_features.shape)\n",
    "print(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "ce315250-ce15-4c2a-8d3e-a4ad7c87dbaf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGsCAYAAAAPJKchAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABwJUlEQVR4nO3deZhcVZk/8O+prt636n1JuunupDsbhCTsm4QdNYLgBoiKiqgJDi4Mwk8dCOISHYEZmRlHB2RxGEQwyqZgIEICQiBAQhaSkHT27vS+b1V1z++Pc5fal+6qrqW/n+fhqapbt27dm+qm3n7Pe94jpJQSRERERAliS/QJEBER0czGYISIiIgSisEIERERJRSDESIiIkooBiNERESUUAxGiIiIKKEYjBAREVFCMRghIiKihGIwQkRERAnFYISIiIgSyp7oE4jGjh078NRTT6G1tRW9vb24+eabceqpp0Z1jNdeew1r165FW1sbioqKcOmll+Kyyy6L0xkTERFROCmVGRkfH0dDQwO+9KUvTer177zzDn75y1/ioosuwi9+8Qtcf/31eOaZZ/DXv/41xmdKREREkUqpzMjSpUuxdOnSoM+7XC489thj2LBhA0ZGRlBXV4fPfvazWLRoEQDglVdewSmnnIKLL74YAFBVVYXLL78cf/7zn3HJJZdACDEt10FERESWlMqMhPOf//mf2LVrF775zW/i5z//OU4//XT8+Mc/RltbGwDA6XQiMzPT6zVZWVno7u5GZ2dnIk6ZiIhoxkubYKS9vR2vvvoqvvWtb2HBggWorq7GZZddhvnz52P9+vUAgCVLlmDTpk147733oGkajh49iueeew4A0NfXl8CzJyIimrlSapgmlNbWVkgpcdNNN3ltd7lcKCgoAABccMEFaG9vx09/+lO43W7k5ubiIx/5CP7whz/AZkubuIyIiCilpE0wIqWEzWbDmjVr/AKLnJwcAIAQAtdeey2uueYa9PX1oaioCO+99x4AoKKiYtrPmYiIiNIoGGloaICmaejv78eCBQtC7muz2VBaWgoAePXVV9HS0oLi4uLpOE0iIiLykVLByNjYGNrb283HHR0d2L9/PwoKClBbW4uzzz4b9913Hz7/+c+jsbERAwMD2LZtG+rr67Fs2TIMDAzg9ddfx6JFi+B0OrF+/Xr84x//wOrVqxN4VURERDObkFLK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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epochs = 200\n",
    "def train(train_loader):\n",
    "    train_ls = []\n",
    "    for epoch in range(epochs):\n",
    "        loss_sum = 0\n",
    "        for train_batch, labels_batch in train_loader:\n",
    "            train_batch, labels_batch = train_batch.to(device), labels_batch.to(device)\n",
    "            #preds = torch.clamp(model(train_batch), 1, float('inf'))\n",
    "            #l = loss(torch.log(preds), torch.log(labels_batch))\n",
    "            l = loss(model(train_batch),labels_batch)\n",
    "            optimizer.zero_grad()\n",
    "            l.backward()\n",
    "            optimizer.step()\n",
    "            loss_sum += l.item()\n",
    "        train_ls.append(loss_sum)\n",
    "    plt.plot(range(epochs), train_ls)\n",
    "    plt.show()\n",
    "train(train_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1781ec89-1761-4f89-a7a7-f74177330382",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
